
//1031.两个非重叠子数组的最大和
class Solution {
public:
    int maxSumTwoNoOverlap(vector<int>& nums, int firstLen, int secondLen) {
        int n=nums.size();

        auto all_max=[&](int first,int second)
        {
            int left=0,right=0;
            for(int i=0;i<first;i++) left+=nums[i];   //求开始时长度为firstLen的和
            for(int i=first;i-first<second;i++) right+=nums[i];   //求开始时长度为secondLen的和

            int ret=left+right,tmp=left;        //tmp来存储左边区间依次向右移动后的区间和结果
            for(int i=first+second;i<n;i++)     
            {
                right+=nums[i]-nums[i-second];   //枚举右
                tmp+=nums[i-second]-nums[i-second-first];

                left=max(left,tmp);
                ret=max(ret,left+right);
            }
            return ret;
        };

        //两个区间没有前后之分,所以多需要求一遍
        return max(all_max(firstLen,secondLen),all_max(secondLen,firstLen));  
    }
};